package io.shallwe.common.interceptor;

import org.apache.commons.lang3.StringUtils;

import com.jfinal.aop.Inject;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;

import io.shallwe.common.kit.IpKit;
import io.shallwe.common.model.Account;
import io.shallwe.login.LoginService;

/**
 * 从 cookie 中获取 sessionId，如果获取到则根据该值使用 LoginService
 * 得到登录的 Account 对象 ---> loginAccount，供后续的流程使用
 * 
 * 注意：将此拦截器设置为全局拦截器，所有 action 都需要
 */
public class LoginSessionInterceptor implements Interceptor {
	
	@Inject
	LoginService loginSrv;
	
	public void intercept(Invocation inv) {
			Account loginAccount = null;
			Controller c = inv.getController();
			String sessionId = c.getCookie(LoginService.sessionIdName);
			String controllerKey = inv.getController().getControllerKey();
			if (sessionId != null) {
				loginAccount = loginSrv.getLoginAccountWithSessionId(sessionId);
				if (loginAccount != null) {
					c.setAttr(LoginService.loginAccountCacheName, loginAccount);
					inv.invoke();
				} else {
					// cookie 登录未成功，证明该 cookie 已经没有用处，删之
					c.removeCookie(LoginService.sessionIdName);
					if (inv.getActionKey().startsWith("/admin")) {
						inv.getController().redirect("/login?returnUrl=" + inv.getActionKey());
					}else {
						inv.invoke();
					}
				}
			}else {
				if (inv.getActionKey().startsWith("/admin")) {
					inv.getController().redirect("/login?returnUrl=" + inv.getActionKey());
				}else {
					inv.invoke();
				}
			}
		}
	}



